
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 		Subroutine: CC2400_TXtoRX
//		Switches from active TX to active RX.
//		Assumes that TX is using 1MHz IF.
//		r0	= scrambled
//		r1	= out: 8 bit status byte
//		r2	= scrambled
//		r7	= in: return address
//		Procedure: Drop back to FS_ON, Turn on LNA and Mixer, wait 10 us, 
//		switch to RX mode. A 40 us delay is needed before sending data.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

//---------------------
// Avaliable Routines
//
// CC2400_TXtoRX
// CC2400_TXtoRX_ChannelChange
// CC2400_RXtoTX
// CC2400_RXtoTX_ChannelChange
// CC2400_RXtoRX_ChannelChange
// put_CC2400_FIFO_WORD
// put_CC2400_FIFO
// put_CC2400_register
// put_CC2400_Strobe
// get_CC2400_register
// get_CC2400_status
// get_CC2400_state
// put_CC2400_state


CC2400_TXtoRX:
		inp	r0, GPEin
		bis	r0, r0, _CC2400_RX
		outp	r0, GPEout					//switch to state FS_On[9]

//		mov	r1, _MANAND_regAddr
//		mov	r2, 0xFFFE					//turn on the LNA and Mixers
//		jsr	r6, put_CC2400_register
	//need to wait 10 us, 62 instructions
		
		inp	r0,GPHin
		bic	r0,r0,_BBUdirection
		outp	r0,GPHout					//BBU data pin is input
		
		rol	r0,r0,0
		rol	r0,r0,0
		rol	r0,r0,0
		
//		inp	r1,BBU0time
//		add	r1,r1,12
//	TXtoRX_Wait10us:
//		inp	r0,BBU0time
//		sub	r0,r0,r1
//		bc	LT0,TXtoRX_Wait10us
	
		inp	r0,GPEin
		bic	r0,r0,_CC2400_TX
		outp	r0,GPEout					//switch to RX

		inp	r0,BBU0cfg0
		bic	r0,r0,2
		outp	r0,BBU0cfg0					//Enable bit timing recognizer
				
		mov	r1, _MANAND_regAddr
		mov	r2, 0x7FFF					//set LNA and mixers to turn off when RX does
		jsr	r6, put_CC2400_register
		
		jsr	r7, r7

	
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 		Subroutine: CC2400_TXtoRX_ChannelChange
//		switches from active TX to active RX with a channel change
//		r0	= scrambled
//		r1	= out: 8 bit status byte
//		r2	= in: new cahnnel
//		r7	= in: return address
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//CC2400_TXtoRX_ChannelChange:
//		
//		inp	r0, GPEin
//		bis	r0, r0, _CC2400_RX
//		outp	r0, GPEout					//switch to state FS_On[9]
//                      
//		inp	r0, GPEin
//		bic	r0, r0, _CC2400_TX
//		outp	r0, GPEout
//		rol	r0, r0, 0
//		bic	r0, r0, _CC2400_RX	
//		outp	r0, GPEout					//put CC2400 in state IDLE[1]
//
//		st	r2,NewChannel
//		
//		mov	r1, _FSDIV_regAddr			//program for RX
//		jsr	r6, put_CC2400_register
//
//		inp	r0,GPHin
//		bic	r0,r0,_BBUdirection
//		outp	r0,GPHout					//BBU data pin is input
//				
//		inp	r0 ,GPEin
//		bis	r0 ,r0, _CC2400_TX
//		bis	r0 ,r0, _CC2400_RX
//		outp	r0 ,GPEout					//start frequency synthesizer(FS) on CC2400
//		
//		mov	r1, _MANAND_regAddr
//		mov	r2, 0xFFFE					//turn on the LNA and Mixers
//		jsr	r6, put_CC2400_register		
//		
//
//		inp	r3,BBU0time
//		add	r3,r3,_RFLP_RadioLockup_Timeout_BBUticks
//	TXtoRXWaitForLock10:
//		inp	r1,BBU0time
//		sub	r1,r1,r3
//		bc	GT0,TXtoRXWaitForLock10_Lockup	//watch for radio lockup
//		inp	r1,GPEin
//		bix	r1,r1,_CC2400_Lock
//		bc	VC,TXtoRXWaitForLock10			//wait for FS to lock on new frequency
//		
//		inp	r0,GPEin
//		bic	r0,r0,_CC2400_TX
//		outp	r0,GPEout					//switch to RX
//		
//		mov	r1, _MANAND_regAddr
//		mov	r2, 0xFFFF					//set LNA and mixers to turn off when RX does
//		jsr	r6, put_CC2400_register
//
//		inp	r0,BBU0cfg0
//		bic	r0,r0,2
//		outp	r0,BBU0cfg0					//Enable bit timing recognizer
//		
//		jsr	r7, r7
//
//TXtoRXWaitForLock10_Lockup:
//		ld	r2,NewChannel
//		bra	CC2400_TXtoRX_ChannelChange

		
		
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 		Subroutine: CC2400_RXtoTX
//		switches from active RX to active TX
//		r0	= scrambled
//		r1	= out: 8 bit status byte
//		r2	= scrambled
//		r7	= in: return address
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CC2400_RXtoTX:
		inp	r0, GPEin
		bis	r0, r0, _CC2400_TX
		outp	r0, GPEout					//switch to state FS_On[9]
		
		rol	r0,r0,0
		rol	r0,r0,0
		rol	r0,r0,0
		
		inp	r0,GPHin
		bis	r0,r0,_BBUdirection
		outp	r0,GPHout					//BBU data pin is output
		
		inp	r0,GPEin
		bic	r0,r0,_CC2400_RX
		outp	r0,GPEout					//switch to TX
				
		jsr	r7, r7

		
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 		Subroutine: CC2400_RXtoTX_ChannelChange
//		switches from active RX to active TX with a channel change
//		r0	= scrambled
//		r1	= out: 8 bit status byte
//		r2	= in: new cahnnel
//		r7	= in: return address
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CC2400_RXtoTX_ChannelChange:
		inp	r0, GPEin
		bis	r0, r0, _CC2400_TX
		outp	r0, GPEout					//switch to state FS_On[9]
                      
		inp	r0, GPEin
		bic	r0, r0, _CC2400_RX
		outp	r0, GPEout
		rol	r0, r0, 0
		bic	r0, r0, _CC2400_TX	
		outp	r0, GPEout					//put CC2400 in state IDLE[1]
		
		mov	r1, _FSDIV_regAddr			//program for TX
		jsr	r6, put_CC2400_register
		
		inp	r0 ,GPEin
		bis	r0 ,r0, _CC2400_TX
		bis	r0 ,r0, _CC2400_RX
		outp	r0 ,GPEout					//start frequency synthesizer(FS) on CC2400

		jsr	r7, r7


//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 		Subroutine: CC2400_RXtoRX_ChannelChange
//		switches from active RX to active RX with a channel change
//		r0	= scrambled
//		r1	= out: 8 bit status byte
//		r2	= in: new cahnnel
//		r7	= in: return address
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//CC2400_RXtoRX_ChannelChange:
//		inp	r0, GPEin
//		bis	r0, r0, _CC2400_TX
//		outp	r0, GPEout					//switch to state FS_On[9]
//                      
//		inp	r0, GPEin
//		bic	r0, r0, _CC2400_RX
//		outp	r0, GPEout
//		rol	r0, r0, 0
//		bic	r0, r0, _CC2400_TX	
//		outp	r0, GPEout					//put CC2400 in state IDLE[1]
//
//		mov	r1, _FSDIV_regAddr			//program for RX
//		jsr	r6, put_CC2400_register
//		
//		inp	r0 ,GPEin
//		bis	r0 ,r0, _CC2400_TX
//		bis	r0 ,r0, _CC2400_RX
//		outp	r0 ,GPEout					//start frequency synthesizer(FS) on CC2400
//		
//		mov	r1, _MANAND_regAddr
//		mov	r2, 0xFFFE					//turn on the LNA and Mixers
//		jsr	r6, put_CC2400_register		
//		
//	RXtoRXWaitForLock10:
//		inp	r1,GPEin
//		bix	r1,r1,_CC2400_Lock
//		bc	VC,RXtoRXWaitForLock10			//wait for FS to lock on new frequency
//		
//		inp	r0,GPEin
//		bic	r0,r0,_CC2400_TX
//		outp	r0,GPEout					//switch to RX
//		
//		mov	r1, _MANAND_regAddr
//		mov	r2, 0xFFFF					//set LNA and mixers to turn off when RX does
//		jsr	r6, put_CC2400_register
//		
//		jsr	r7, r7
//

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 		Subroutine: put_CC2400_FIFO_WORD
//		this will bitreverse the data
//		r1	= scrambled
//		r0	= in: 16 bit data word, out: scrambled
//		r6	= in: return address
// time = 1.3 us (SPI Write) + 1.5 us (9 instructions) = 2.8 us
// Equivelant to aprox 3 bits sent by the RF
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//put_CC2400_FIFO_WORD:
//		outp	r0,SFUrev
//		inp	r0,SFUrev
//		rol	r0,r0,8		
//		outp	r0,SPI1tx
//		inp	r1,SPI1rx	
//		rol	r0,r0,8	
//		outp	r0,SPI1tx
//		inp	r1,SPI1rx
//		jsr	r3,r3

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 		Subroutine: put_CC2400_FIFO
//		
//		r0	= scrambled
//		r1	= in: pointer to data buffer
//		r2	= in: data length(bytes,max 32)
//		r6	= in: return address
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//put_CC2400_FIFO:
//		inp	r0,GPEin
//		bic	r0,r0,_CC2400_CSn
//		outp	r0,GPEout
//
//		mov	r0,_FIFOREG
//		outp	r0,SPI0tx
//		inp	r0,SPI0rx
//	put_CC2400_FIFO10:	
//		ld	r0,r1,0
//		outp	r0,SPI0tx
//		inp	r0,SPI0rx
//		
//		add	r1,r1,1
//		sub	r2,r2,1
//		bc	ZC,put_CC2400_FIFO10
//			
//		inp	r0,GPEin
//		bic	r0,r0,_CC2400_RX
//		outp	r0,GPEout
//				
//		rol	r0,r0,0
//		inp	r0,GPEin
//		bis	r0,r0,_CC2400_CSn
//		outp	r0,GPEout	
//
//		jsr	r6,r6	
//
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 		Subroutine: put_CC2400_register
//		
//		r0	= scrambled
//		r1	= in: 7 bit register address
//		r1	= out: 8 bit status byte
//		r2	= in: 16 bit data
//		r6	= in: return address
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
put_CC2400_register:
		inp	r0,GPEin
		bic	r0,r0,_CC2400_CSn
		outp	r0,GPEout
		
		outp	r1,SPI1tx
		inp	r1,SPI1rx
		
		rol	r2,r2,8
		outp	r2,SPI1tx
		inp	r0,SPI1rx
		rol	r2,r2,8
		outp	r2,SPI1tx
		inp	r2,SPI1rx
		
		inp	r0,GPEin
		bis	r0,r0,_CC2400_CSn
		outp	r0,GPEout	
		
		jsr	r6,r6	
	
		
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 		Subroutine: put_CC2400_Strobe
//		
//		r0	= scrambled
//		r1	= in: 7 bit register address
//		r1	= out: 8 bit status byte
//		r6	= in: return address
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
put_CC2400_Strobe:
		inp	r0,GPEin
		bic	r0,r0,_CC2400_CSn
		outp	r0,GPEout
		
		outp	r1,SPI1tx
		inp	r1,SPI1rx
		
		inp	r0,GPEin
		bis	r0,r0,_CC2400_CSn
		outp	r0,GPEout	
		
		
		
		jsr	r6,r6	
	
	
	
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 		Subroutine: get_CC2400_register
//		
//		r0	= scrambled
//		r1	= in: 7 bit register address
//		r1	= out: 8 bit status byte
//		r2	= out: 16 bit data
//		r6	= in: return address
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//get_CC2400_register:
//		inp	r0,GPEin
//		bic	r0,r0,_CC2400_CSn
//		outp	r0,GPEout
//		
//		bis	r1,r1,7
//		outp	r1,SPI0tx
//		inp	r1,SPI0rx
//		
//		mov	r0,0x00
//		outp	r0,SPI0tx
//		inp	r2,SPI0rx
//		rol	r2,r2,8
//		outp	r0,SPI0tx
//		inp	r0,SPI0rx
//		ior	r2,r2,r0
//		
//		inp	r0,GPEin
//		bis	r0,r0,_CC2400_CSn
//		outp	r0,GPEout	
//		
//		jsr	r6,r6			
//		
		
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 		Subroutine: get_CC2400_status
//		
//		r0	= scrambled
//		r1	= in: 7 bit register address
//		r1	= out: 8 bit status byte
//		r6	= in: return address
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
get_CC2400_status:

		inp	r0,GPEin
		bic	r0,r0,_CC2400_CSn
		outp	r0,GPEout
		
		bis	r1,r1,7
		outp	r1,SPI1tx
		inp	r1,SPI1rx
		
		inp	r0,GPEin
		bis	r0,r0,_CC2400_CSn
		outp	r0,GPEout
		
		//correct value not returned for "wait for oscilator"
		jsr	r6,r6			
		
		

//get_CC2400_state:
//		st	r6,sp,0
//		add	sp,sp,1
//		mov	r3,CC2400_state_RegisterNumberTable
//		
//	get_CC2400_state10:	
//		ld	r1,r3,0
//		jsr	r6,echo_hex
//		mov	r1,MSG_TAB
//		jsr	r6,echo_msg
//				
//		ld	r1,r3,0
//		jsr	r6,get_CC2400_register		
//		jsr	r6,echo_hex
//		mov	r1,MSG_TAB
//		jsr	r6,echo_msg
//		add	r1,r2,0
//		jsr	r6,echo_hex		
//		mov	r1,MSG_NEWLINE
//		jsr	r6,echo_msg
//		add	r3,r3,1
//		sub	r0,r3,CC2400_state_RegisterNumberTable_end
//		bc	NE,get_CC2400_state10
//
//		mov	r1,MSG_NEWLINE
//		jsr	r6,echo_msg
//		sub	sp,sp,1
//		ld	r6,sp,0
//		jsr	r6,r6	
//	
	
	
put_CC2400_state:
		st	r6,sp,0
		add	sp,sp,1
		mov	r3,CC2400_state_RegisterNumberTable
		mov	r4,CC2400_state_initial_Table
		
	put_CC2400_state10:	
		ld	r1,r3,0
		ld	r2,r4,0
		jsr	r6,put_CC2400_register

		add	r4,r4,1
		add	r3,r3,1
		sub	r0,r3,CC2400_state_RegisterNumberTable_end
		bc	NE,put_CC2400_state10
		
		sub	sp,sp,1
		ld	r6,sp,0
		jsr	r6,r6